package xyz.cerberu.cet.global.domain;

import xyz.cerberu.cet.global.utils.ListUtils;

import java.util.List;

/**
 * @author β世界
 * Created on 19:04
 * @Description 分页信息实体对象
 */
public class Page<T> {
    /** 当前页面 **/
    private int pageNum = 0;
    /** 第一页 **/
    private int firstPage = 1;
    /** 最后一页 **/
    private int lastPage = 1;
    /** 总页数 **/
    private int pageSum;
    /** 显示总数,默认为10个数 **/
    private int showNumber = 10;
    /** 分页信息 **/
    private List<T> information;

    public int getIndexPage() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getFirstPage() {
        return firstPage;
    }

    public void setFirstPage(int firstPage) {
        this.firstPage = firstPage;
    }

    public int getLastPage() {
        return lastPage;
    }

    public void setLastPage(int lastPage) {
        this.lastPage = lastPage;
    }

    public int getPageSum() {
        return pageSum;
    }

    /**
     * @author β世界 on 22:34 2020/9/20
     * 提供所要分页的数据的全部数量(例如数据库中有100条，但是我们只显示几十条)，计算总页数
     **/
    public void setPageSum(int pageSum) {
        if(pageSum < showNumber){
            this.pageSum= 1;
        }else if(pageSum != 0 && pageSum % showNumber == 0){
            this.pageSum = pageSum / showNumber;
        } else{
            this.pageSum = (pageSum / showNumber) + 1;
        }
    }

    public int getShowNumber() {
        return showNumber;
    }

    public void setShowNumber(int showNumber) {
        this.showNumber = showNumber;
    }

    public List<T> getInformation() {
        return information;
    }

    public void setInformation(List<T> information) {
        this.information = information;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageNum=" + pageNum +
                ", firstPage=" + firstPage +
                ", lastPage=" + lastPage +
                ", pageSum=" + pageSum +
                ", showNumber=" + showNumber +
                ", information=" + information +
                '}';
    }

    public Page() {
    }

    public Page(int indexPage, int firstPage, int endPage, int sumPageNumber, int showNumber, List<T> information) {
        this.pageNum = indexPage;
        this.firstPage = firstPage;
        this.lastPage = endPage;
        this.pageSum = sumPageNumber;
        this.showNumber = showNumber;
        this.information = information;
    }

    /**
     * @author β世界 on 9:41 2021/3/26
     * 用于自动创建Page的构造器
     * @param data: page分页的数据
     * @param pageNum : 当前页码
     * @param size : 一页显示的数量
     **/
    public static <T> Page<T> build(List<T> data,int pageNum,int size){
        Page<T> page = new Page<>();
        // 设置当前页码
        page.setPageNum(pageNum);
        // 设置一页的显示数量
        page.setShowNumber(size);
        // 计算总页数
        page.setPageSum(data.size());
        // 设置开头页和结尾页
        page.setFirstPage(1);
        page.setLastPage(page.getPageSum());
        // 设置分页数据
        // 判断页码是否合理
        pageNum = pageNum - 1;
        if(pageNum < page.firstPage){
            pageNum = 0;
        }else if(pageNum >= page.lastPage){
            pageNum = page.lastPage;
        }
        // 对数据进行切割
        page.setInformation(ListUtils.subList(data,pageNum*page.showNumber,page.showNumber));
        return page;
    }

}